program ptr_trunc
  use iso_c_binding, only: c_ptr, c_f_pointer, c_int, c_loc
  implicit none

  type(c_ptr) :: p
  integer(c_int) :: ival
  real, pointer :: arr(:)

  ! 从 C 获得一个指针（这里模拟，用 LOC 将 arr_loc 强转）
  integer, target :: arr_loc(5) = [1,2,3,4,5]
  p = c_loc(arr_loc)

  ! 错误地把指针当作整数存取
  ival = transfer(p, ival)     ! 在 32 位下 p 和 ival 都是 4 字节
  print *, 'Stored integer = ', ival

  ! 再转回指针，运行出错
  call c_f_pointer(transfer(ival, p), arr, [5])
  print *, 'arr =', arr
end program

